from django.shortcuts import render
from meiduo_mall.libs.yuntongxun.sms import CCP
from django.views import View
from django_redis import get_redis_connection

from meiduo_mall.utils.log import logger_out
from . import constants
from django import http
from meiduo_mall.utils.response_code import RETCODE
from meiduo_mall.libs.captcha.captcha import captcha
from celery_tasks.sms.tasks import send_sms

import random


# 验证图形是否发送一致
class ImageCodeView(View):
    def get(self, request, uuid):
        # 获取前端的uuid
        # 生成图形验证码
        text, code, image = captcha.generate_captcha()
        print("code is{}".format(code))
        # 图形验证码保存到redis缓冲区里面：键是uuid,值是图形验证码的图形文本内容字符串
        redis_cli = get_redis_connection("image_code")
        redis_cli.setex(uuid, constants.IMAGE_CODE_EXPIRES, code)
        # 并将图片返回
        return http.HttpResponse(image, content_type="image/png")


# 验证手机号，并发送短信
class SmsCodeView_1(View):
    def get(self, request, mobile):
        # 首先获取需要的手机号和图形验证码
        uuid = request.GET.get('image_code_id')
        image_code = request.GET.get('image_code')

        # 判断是否处于手机发送短信的60s时间内
        redis_cli_sms = get_redis_connection('sms_code')
        if redis_cli_sms.get(mobile + "_flag") is not None:
            return http.JsonResponse({'code': RETCODE.SMSCODERR,
                                      'errmsg': "发送太频繁！"
                                      })

        # 其次判断获取内容是否有效
        # 判断是否为空
        if not all([uuid, image_code]):
            return http.JsonResponse({'code': RETCODE.PARAMERR,
                                      'errmsg': "参数不完整！"
                                      })
        # 判断图形验证码是否ok
        # 先判断在redis缓存中的图形失败码是否过期
        redis_cli_image = get_redis_connection("image_code")
        image_code_redis = redis_cli_image.get(uuid)
        if image_code_redis is None:
            logger_out.warning('已经过期')
            return http.JsonResponse({'code': RETCODE.IMAGECODEERR,
                                      'errmsg': "你的图形验证码已经过期！"})
        # 防止有人频繁测试，浪费redis空间
        # try:
        #     redis_cli_image.delete(uuid)
        # except Exception as e:
        #     print(e)

        # 判断ajax请求的图形验证码和从redis中读取的图形验证码是否一致
        if image_code_redis.decode("utf-8").lower() != image_code:
            logger_out.warning(image_code_redis.decode())
            logger_out.warning(image_code)
            return http.JsonResponse({'code': RETCODE.IMAGECODEERR,
                                      'errmsg': "输入的图形验证码不正确！"})
        # 如果验证码判断正确,删除uuid
        # redis_cli_sms.delete(mobile)
        # redis_cli_sms.delete(mobile+"_flag")
        # 对接短信验证
        # 先生成6位随机数
        sms_code = "%06d" % random.randint(0, 999999)
        # 将该数字放在缓存里面，并通过第三方给手机发短信
        # redis_cli = get_redis_connection("sms_code")
        # redis_cli.setex(mobile, constants.SMS_CODE_EXPIRES, sms_code)
        # redis_cli.setex(mobile+"_flag", constants.SMS_CODE_FLAG_EXPIRES, 1)

        # 优化程序，连续两次设置缓存区，可以使用管道
        redis_pl = redis_cli_sms.pipeline()
        # 存储手机号，点击注册时候过期时间
        redis_pl.setex(mobile, constants.SMS_CODE_EXPIRES, sms_code)
        # 存储手机号标志为，
        redis_pl.setex(mobile + "_flag", constants.SMS_CODE_FLAG_EXPIRES, 1)
        redis_pl.execute()

        # 并通过第三方给手机发短信
        # ccp = CCP()
        # 注意： 测试的短信模板编号为1
        # print("正在发送手机号！")
        # 测试代码
        # ccp.send_template_sms(mobile, [sms_code, 1], 1)
        # 通过delay调用，可以将任务加到队列中，交给celery去执行
        # send_sms.delay(mobile, sms_code)
        print(mobile)
        print(sms_code)
        logger_out.warning(sms_code)
        return http.JsonResponse({'code': RETCODE.OK,
                                  'errmsg': "ok！"})


class SmsCodeView(View):
    """it's a test"""

    def get(self, request, mobile):
        send_sms.delay("17603095488", "123456")
        return http.JsonResponse({"code": RETCODE.OK})
